iT邦幫忙

2024 iThome 鐵人賽

DAY 7
0
佛心分享-刷題不只是刷題

Ruby刷題:沒那麼痛苦的痛苦面具系列 第 30

DAY 30:Basic Calculator II 沒在排隊的LIFO堆疊!

  • 分享至 

  • xImage
  •  

☆(≧∀≦*)ノ
嗨,我是wec,今天是DAY 30,最後一天嚕!

🔎 題目難度與描述

難度:MEDIUM

題目描述:

給定一個字符串表示的數學表達式,包含非負整數和 +, -, *, / 四種基本運算符,要求計算出它的結果。假設表達式是合法的,且不會有空格以外的其他字符。操作符之間可以有空格。

🔎 解題思路&程式碼

1️⃣ 堆疊

第1步: 使用一個堆疊來儲存數字和計算結果,然後建立一個變數num來存儲當前解析的數字,和一個sign來追蹤當前操作符(默認為+)。
第2步: 遍歷每個字符,如果是數字,將它組合到num中。
如果是操作符(或最後一個字符),基於當前的sign處理運算:

  1. +:將num壓入堆疊。
  2. -:將-num壓入堆疊。
  3. *:將堆疊頂部的元素乘以num,然後壓入堆疊。
  4. /:將堆疊頂部的元素整除num,然後壓入堆疊。
    5.更新sign為當前操作符,並重置num
    第3步: 堆疊中所有的值相加,即為最終結果。
    程式碼:
def calculate(s)
  stack = []
  num = 0
  sign = '+'
  
  s.chars.each_with_index do |char, i|
    if char =~ /\d/
      num = num * 10 + char.to_i
    end
    
    if (!char =~ /\d/ && char != ' ') || i == s.length - 1
      case sign
      when '+'
        stack.push(num)
      when '-'
        stack.push(-num)
      when '*'
        stack.push(stack.pop * num)
      when '/'
        stack.push((stack.pop.to_f / num).to_i)
      end
      sign = char
      num = 0
    end
  end

  stack.sum
end

🔎 總結

時間複雜度

堆疊: O(n),n為輸入字符串的長度。
➡️ 會挑選這題是因為數學有著先乘除後加減的特性,而堆疊就是很好解決的方法,我們用堆疊來暫存數字,當遇到乘法或除法時,再從堆疊頂部取出數字進行運算,最後將結果重新放回堆疊(加減法就直接將正負數放到堆疊裡就可以了!)。而使用numsign兩個變數則是可以避免頻繁的數字轉換跟操作符解析(´▽`)ノ !

那麽,以上就是最後一天的內容囉!

相信IT人動腦時都要吃點東西,所以今天邊寫邊吃無印良品的白巧克力草莓。
謝謝看到這裡的你,有機會再見嚕!掰掰〃•ω‹〃♡!!


上一篇
DAY 29:Daily Temperatures 沒在排隊的LIFO堆疊!
系列文
Ruby刷題:沒那麼痛苦的痛苦面具30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言